#获取一个有限元素列表的所有子集
from plzh import *

#二进制法求子集
'''  映射如下
0 [] --> 0000
1 [1] --> 0001
2 [2] --> 0010
3 [1, 2] --> 0011
4 [3] --> 0100
5 [1, 3] --> 0101
6 [2, 3] --> 0110
7 [1, 2, 3] --> 0111
8 [4] --> 1000
9 [1, 4] --> 1001
10 [2, 4] --> 1010
11 [1, 2, 4] --> 1011
12 [3, 4] --> 1100
13 [1, 3, 4] --> 1101
14 [2, 3, 4] --> 1110
15 [1, 2, 3, 4] --> 1111
'''
def get_ziji(listA):
    all_zj = [] #存放所有子集
    N = len(listA)
    for i in range(2 ** N): #子集的个数
        ziji = []
        for j in range(N): #用来判断二进制数的下标为j的位置的数是否为1
            if (i >> j) % 2 == 1:
                ziji.append(listA[j])
        all_zj.append(ziji)
        #print(ziji)
    return all_zj
#print(get_ziji(list1))

#将列表元素逐个加入前面元素形成的所有子集中
def get_zj(listA):
    all_zj = [[]]  #存放所有子集
    for i in listA:   #依次得到listA中的新元素
        for j in range(len(all_zj)):
            #将list0中已存在的所有子集都复制出来，加入新元素后，加到list0中
            a = all_zj[j].copy()
            a.append(i)
            all_zj.append(a)
            #print(a)
            yield a  #列表元素过多时，使用生成器减小内存占用

#for i in get_zj(list1):
#    print(i)

'''
#存在问题的方法，无法获取非连续索引的子集
def get_ziji(listA):
        ziji = []
        for i in range(0,len(listA)):
            for j in range(i+1, len(listA)+1):
                ziji.append(listA[i:j])
        return ziji
print(get_ziji(list1))
'''
